package com.shlh.saas.service.company;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.shlh.saas.entity.company.Company;

import java.util.List;
import java.util.Map;

/**
 * 全球企业库服务接口
 */
public interface CompanyService extends IService<Company> {
    
    /**
     * 根据公司名称查询企业
     * @param companyName 公司名称
     * @return 企业列表
     */
    List<Company> findByCompanyName(String companyName);
    
    /**
     * 根据行业查询企业
     * @param industry 行业
     * @return 企业列表
     */
    List<Company> findByIndustry(String industry);
    
    /**
     * 根据国家查询企业
     * @param country 国家
     * @return 企业列表
     */
    List<Company> findByCountry(String country);
    
    /**
     * 根据邮箱查询企业
     * @param email 邮箱
     * @return 企业
     */
    List<Company> findByEmail(String email);


    /**
     * 根据电话号查询企业
     * @param phone 电话号码
     * @return 企业
     */
    List<Company> findByPhone(String phone);
    
    /**
     * 获取所有全球企业库数据
     */
    List<Company> getAllGlobalEnterprises();

    /**
     * 分页获取全球企业库数据
     * @param page 页码
     * @param size 每页大小
     * @return 企业列表
     */
    Page<Company> getGlobalEnterprisesPage(int page, int size);
    
    /**
     * 统计全球企业库数据总数
     * @return 数据总数
     */
    long countGlobalEnterprises();

    /**
     * 根据条件搜索全球企业库数据
     * 
     * @param companyName 公司名称
     * @param country 国家
     * @param city 城市
     * @param industry 行业
     * @param employee 员工规模
     * @param reveneu 收入规模
     * @return 符合条件的企业列表
     */
    List<Company> searchGlobalEnterprises(String companyName, String country, String city, String industry, String employee, String reveneu);
    
    /**
     * 根据条件分页搜索全球企业库数据
     * 
     * @param companyName 公司名称
     * @param country 国家
     * @param city 城市
     * @param industry 行业
     * @param employee 员工规模
     * @param reveneu 收入规模
     * @param page 页码
     * @param size 每页大小
     * @return 符合条件的企业列表
     */
    Page<Company> searchGlobalEnterprisesPage(String companyName, String  firstName, String lastName, String country, String city, String industry, String employee, String reveneu,
                                              String zipcode, String department, String occupation, String state, String hasContact, int page, int size);
    
    /**
     * 统计符合条件的全球企业库数据总数
     * 
     * @param companyName 公司名称
     * @param country 国家
     * @param city 城市
     * @param industry 行业
     * @param employee 员工规模
     * @param reveneu 收入规模
     * @return 数据总数
     */
    long countSearchGlobalEnterprises(String companyName, String country, String city, String industry,
                                      String employee, String reveneu, String firstName, String lastName,
                                      String zipcode, String department, String occupation, String state, String hasContact);
    
    /**
     * 在所有字段中搜索关键词
     * 
     * @param keyword 搜索关键词
     * @param offset 偏移量
     * @param limit 限制数量
     * @return 符合条件的数据列表
     */
    List<Company> searchByKeywordInAllFields(String keyword, int offset, int limit);
    
    /**
     * 统计所有字段中包含关键词的记录数量
     * 
     * @param keyword 搜索关键词
     * @return 记录总数
     */
    long countByKeywordInAllFields(String keyword);
    
    /**
     * 获取搜索建议
     * 
     * @param keyword 关键词
     * @return 搜索建议列表
     */
    List<String> getSuggestions(String keyword);

    /**
     * 根据条件搜索全球企业数据（用于导出）- 两阶段查询模式
     * 第一阶段：从ES获取标识信息，第二阶段：从数据库获取完整数据
     * @param params 搜索参数
     * @return 企业列表
     */
    List<Company> searchGlobalEnterprisesForExport(Map<String, Object> params);

    /**
     * 使用多线程批量处理方式查询全球企业数据（针对大数据量导出优化）
     * 第一阶段：从ES获取标识信息，第二阶段：使用多线程从数据库并行查询完整数据
     * @param params 搜索参数
     * @return 企业列表
     */
    List<Company> searchGlobalEnterprisesForExportOptimized(Map<String, Object> params);

    /**
     * 第一阶段：从ES查询获取企业标识信息（表名和ID）
     * @param params 搜索参数
     * @return 企业标识信息列表
     */
    List<Map<String, Object>> getEnterpriseIdentifiersFromES(Map<String, Object> params);

    /**
     * 第二阶段：根据标识信息从数据库查询完整企业数据
     * @param identifiers 企业标识信息列表
     * @return 完整的企业数据列表
     */
    List<Company> getCompleteEnterpriseDataFromDB(List<Map<String, Object>> identifiers);

    Company getDetailByTableAndId(String enterpriseId, String mt);

    List<Company> searchCompaniesWithEmail(String searchKeyword, int offset, int size);

    Long countCompaniesWithEmail(String searchKeyword);

    List<Company> searchCompaniesWithPhone(String searchKeyword, int offset, int size);

    Long countCompaniesWithPhone(String searchKeyword);

    List<Map<String, Object>> searchByEmail(String value, int size, int offset);

    List<Map<String, Object>> searchByPhone(String value, int size, int offset);

    long countByEmail(String value);

    long countByPhone(String value);

    List<Map<String, Object>> findByDomain(String domain, int size, int offset);

    long countByDomain(String domain);

    List<String> searchCities(String city);

    List<String> searchIndustries(String industry);

    List<String> searchOccupations(String occupations);

    List<String> searchDepartments(String departments);

    List<Company> searchCompanyData(String companyName, String fullName, String website, Integer matchType);


}